#pragma once

#include <algorithm>
#include <chrono>
#include <cstdarg>
#include <ctime>
#include <iostream>
#include <mutex>

#include "burnpipe.h"

namespace burn {

/**
 * 定制化输出
 * @param cmd
 * @param ...
 * 注：内部包含全局锁，不建议正式上线的时候使用
 */

/**
 * 通用容器累加信息
 * @tparam T (例：std::vector<int>)
 * @param container
 * @return
 */
template <typename T>
typename T::value_type CGRAPH_CONTAINER_SUM(const T &container) {
  typename T::value_type result = 0;
  for (const auto &val : container) {
    result += val;
  }
  return result;
}

/**
 * 通用容器累乘信息
 * @tparam T (例：std::vector<int>)
 * @param container
 * @return
 */
template <typename T>
typename T::value_type CGRAPH_CONTAINER_MULTIPLY(const T &container) {
  typename T::value_type result = 1;
  for (const auto &val : container) {
    result *= val;
  }
  return result;
}

/**
 * 获取max值
 * @tparam T
 * @param value
 * @return
 */
template <typename T> T CGRAPH_MAX(T val) { return val; }

template <typename T, typename... Args> T CGRAPH_MAX(T val, Args... args) {
  return std::max(val, CGRAPH_MAX(args...));
}

/**
 * 累加
 * @tparam T
 * @param t
 * @return
 */
template <typename T> T CGRAPH_SUM(T t) { return t; }

template <typename T, typename... Args> T CGRAPH_SUM(T val, Args... args) {
  return val + CGRAPH_SUM(args...);
}

} // namespace burn